/**
 * 浏览器扩展错误过滤器
 * 专门用于过滤和忽略来自浏览器扩展的错误
 */

/**
 * 扩展错误特征列表
 */
const EXTENSION_ERROR_PATTERNS = [
  // 路径特征
  '/writing/get_template_list',
  '/writing/',
  'get_template_list',
  
  // 错误类型特征
  'permission error',
  'exceptions.UserAuthError',
  'UserAuthError',
  
  // 扩展脚本特征
  'background.js',
  'content_script',
  'extension://',
  'chrome-extension://',
  'moz-extension://',
  'safari-extension://',
  
  // 特定扩展标识
  'chrom…bcbjgholdjcjblkibolbppb',
  'te.handleRes',
];

/**
 * 检查是否为扩展错误
 * @param {any} error - 错误对象
 * @returns {boolean} 是否为扩展错误
 */
export const isExtensionError = (error) => {
  if (!error) return false;
  
  try {
    const errorString = JSON.stringify(error);
    const errorMessage = error.message || '';
    const errorStack = error.stack || '';
    const errorName = error.name || '';
    
    // 检查所有可能的错误特征
    const allErrorText = [
      errorString,
      errorMessage,
      errorStack,
      errorName,
      error.toString()
    ].join(' ');
    
    // 如果包含任何扩展错误特征，则认为是扩展错误
    return EXTENSION_ERROR_PATTERNS.some(pattern => 
      allErrorText.toLowerCase().includes(pattern.toLowerCase())
    );
  } catch (e) {
    // 如果检查过程中出错，默认不是扩展错误
    return false;
  }
};

/**
 * 过滤扩展错误
 * @param {any} error - 错误对象
 * @returns {boolean} 是否应该忽略此错误
 */
export const shouldIgnoreError = (error) => {
  return isExtensionError(error);
};

/**
 * 安全的错误处理
 * @param {any} error - 错误对象
 * @param {Function} handler - 错误处理函数
 */
export const safeErrorHandler = (error, handler) => {
  if (shouldIgnoreError(error)) {
    console.warn('🚫 已忽略浏览器扩展错误:', {
      message: error.message,
      code: error.code,
      path: error.reqInfo?.path
    });
    return;
  }
  
  // 调用真正的错误处理函数
  if (typeof handler === 'function') {
    handler(error);
  }
};

/**
 * 设置扩展错误过滤器
 */
export const setupExtensionErrorFilter = () => {
  // 重写 console.error 来过滤扩展错误
  const originalConsoleError = console.error;
  console.error = (...args) => {
    const error = args[0];
    if (shouldIgnoreError(error)) {
      console.warn('🚫 已过滤扩展错误:', error.message || error);
      return;
    }
    originalConsoleError.apply(console, args);
  };
  
  // 监听未处理的Promise错误
  window.addEventListener('unhandledrejection', (event) => {
    if (shouldIgnoreError(event.reason)) {
      console.warn('🚫 已忽略扩展Promise错误:', event.reason.message);
      event.preventDefault();
      return;
    }
  });
  
  // 监听全局错误
  window.addEventListener('error', (event) => {
    if (shouldIgnoreError(event.error)) {
      console.warn('🚫 已忽略扩展JavaScript错误:', event.error.message);
      return;
    }
  });
  
  console.log('✅ 扩展错误过滤器已启用');
};
